package com.smart.home.controller.Home;

import com.smart.home.context.UserContext;
import com.smart.home.dto.Home.DeleteMemberDto;
import com.smart.home.dto.Home.GrantUserDto;
import com.smart.home.dto.Home.HomeDto;
import com.smart.home.result.Result;
import com.smart.home.service.HomeService;


import com.smart.home.vo.HomesListVO;
import com.smart.home.vo.HomesVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@Slf4j
@Api(tags = "家庭管理模板")
@RequestMapping("/home")
public class HomeController {

    @Autowired
    private HomeService homeService;

    /**
     * 创建家庭
     * @param homeDto
     * @return
     */
    //TODO 没有测试
    @ApiOperation("创建家庭")
    @PostMapping("/create")
    public Result<Long> CreateHomeDto(@RequestBody HomeDto homeDto){
        log.info("创建家庭,参数:{}", homeDto);
        homeService.CreateHome(homeDto);
        return Result.success(UserContext.getUserId());
    }

    /**
     * 加入家庭
     * @return
     */
    @ApiOperation("加入家庭")
    @PostMapping("/join")
    public Result JoinHome(@RequestBody HomeDto homeDto){
        log.info("加入家庭,参数:{}", homeDto);
        homeService.JoinHome(homeDto);

        return Result.success();
    }

    /**
     * 返回相关id的用户所有家庭详细信息
     */
    @ApiOperation("返回相关id的用户所有家庭详细信息")
    @GetMapping("/get")
    public Result<List<HomesVO>>  GetUerHome(){
        log.info("返回相关id的用户所有家庭:{}",UserContext.getUserId());
        List<HomesVO> homesVO =homeService.GetUerHome();
        return Result.success(homesVO);
    }


    /**
     * 返回相关id的用户所有家庭列表
     * @return
     */
    @ApiOperation("返回相关id的用户所有家庭列表")
    @GetMapping("/list")
    public Result<List<HomesListVO>> GetUerHomeList(){
        log.info("返回相关id的用户所有家庭列表:{}",UserContext.getUserId());
        List<HomesListVO> homesListVO =homeService.GetUerHomeList();
        return Result.success(homesListVO);
    }


    /**
     * 拥有者授权用户
     * 具体步骤；通过用户id查询家庭成员是否是屋主，然后判断他要修改的是那个屋子的那个用户权限，通过这个家庭成员返回相关家庭的id然后
     */
    @ApiOperation("拥有者授权用户")
    @PostMapping("/grant/")
    public Result GrantUser(@RequestBody GrantUserDto grantUserDto){
        log.info("授权用户,参数:{}", grantUserDto);
        homeService.GrantUser(grantUserDto);


        return Result.success();
    }

    /**
     * 删除家庭
     * 条件：1.家庭创建者删除家庭
     * 要求：将该家庭里面的所有其他成员相关的也删除，事务
     * @return
     */
    @ApiOperation("删除家庭")
    @DeleteMapping("/delete/homeId")
    public Result DeleteHome(@PathVariable Long homeId){
        log.info("删除家庭:{}",homeId);
        homeService.DeleteHome(homeId);
        return Result.success();
    }

    /**
     * 退出家庭
     * 只退出自己的家庭
     * @return
     */
    @ApiOperation("退出家庭")
    @DeleteMapping("/logout/homeId")
    public Result LogoutHome(@PathVariable Long homeId){
        log.info("退出家庭:{}",homeId);
        homeService.LogoutHome(homeId);
        return Result.success();
    }

    /**
     * 删除成员
     */
    @ApiOperation("删除成员")
    @DeleteMapping("/delete/member")
    public Result DeleteMember(@RequestBody DeleteMemberDto deleteMemberDto){
        log.info("删除成员id:{}",deleteMemberDto.getTargetUserId());
        homeService.DeleteMember(deleteMemberDto);
        return Result.success();
    }


}